Самостоятельное исправление ошибок в CPU

Данная статья предназначена для сильно продвинутых пользователей, понимающих, что они делают и каковы последствия в случае неудачи. Материал подаётся по принципу "As Is", и автор не несёт никакой ответственности за моральный или материальный ущерб, могущий возникнуть как у читателя после прочтения данного материала, так и у третьей стороны от действий читателя после прочтения данного материала. Максимально возможная техническая неприятность в случае неграмотных действий пользователя или воздействия внешних причин вызовет необходимость перепрошивки флеш-памяти с образом BIOS на внешнем программаторе.

Прочитав статью "Исправление ошибок в CPU", я выполнил указанные в ней действия, загрузив тем самым в область DMI 2-килобайтный блок программного исправления ошибок микроядра CPU. Однако попытка получить спустя полгода новую базу исправлений ошибок (PEP15.PDB) как от изготовителя процессора (фирмы Intel), так и от продавца не увенчались успехом: продавец (фирма "IQ Computers") отвечает, что у него нет доступа к интеловской базе (что в общем-то странно и может означать, на мой взгляд, только то, что торговля процессорами этим продавцом осуществляется по "серым" каналам, не имеюшим официального выхода на Intel), а техсаппорт изготовителя отвечает буквально следующее:


===

From: Intel Customer Support <support@mailbox.cps.intel.com>
Subject: RE: Latest version of P6+ ERRATA corrections base
Date: 10 июня 1999 г. 0:52

01:44 PM
6/9/99

Hello Sergey,
The file is available here:
http://channel.intel.com/business/ibp/private/integration/downloads/p6bu.htm

The site is password protected. Your Intel(R) rep should be able to assist
you if you do not have the password.
--------
Joseph K
*All brands and trademarks are the property of their respective owners
===

Анализируя возможные пути и способы получения этой базы по неофициальным каналам, я обратил внимание на блоки CPUCODE в Award-BIOS'ах различных фирм-изготовителей материнских плат. Более пристальный анализ формата этих блоков показал, что он либо полностью совпадает с форматом PEP15.PDB (как в BIOS'ах от A-Bit, например; имя файла -- CPUCODE.BIN), либо блокам из PEP15.PDB предшествует некий заголовок неизвестного мне формата (как в BIOS'ах от ASUS; имя файла -- CPUCODE.EXE, хотя никакого отношения к исполнимым файлам формата *.EXE он не имеет). Каждый 2-килобайтный (2048 байт) блок файла PEP15.PDB (или, что то же самое, CPUCODE.BIN) содержит заголовок следующего, насколько мне удалось разобрать сравнительным анализом, формата:

Смещение (16cc.) Длина (10cc.) или формат Описание
+0 двойное слово Номер версии формата (не встречал отличное от 1)
+4 двойное слово Номер версии блока для данного CPUID
+8 4 байта Дата выхода данной версии блока
+8 слово Год выхода (0x9919 -- 1999 год)
+A байт День выхода (0x12 -- 12-е число)
+B байт Месяц выхода (0x12 -- декабрь)
+C слово CPUID процессора, для которого предназначен блок
+E слово Не используется (заполнено нулями)
+10 4 байта ??? Возможно, -- контрольная сумма
+14 двойное слово Номер версии формата (???, не встречал отличное от 1)
+18 двойное слово Номер модификации процессора (???; в пределах одного файла базы попадались блоки с одинаковым словом по адресу +C, но с разными -- по адресу +18)
+1C двойное слово Не используется (заполнено нулями)
+20 16 байтов Не используется (заполнено нулями)
+30 до конца блока Содержательная часть (собственно исправления микрокода)

Для тех, кто не знает: в слове -- 2 байта, в двойном слове -- 4 байта, информация записывается в файле "задом наперёд", т.е. сначала идёт младший байт, а за ним -- старший. Число 1 в файле представляется в виде двойного слова как 0x01000000.

Руководствуясь вышеизложенным, я вычленил из оригинальной январской 1999 года базы PEP15.PDB такие 2-килобайтные блоки и записал их в отдельные файлы, дав каждому из них имя aaaabbcc.BIN, где aaaa -- CPUID из заголовка (+C), bb -- номер модификации (?) процессора из заголовка (+18), cc -- версия блока для данного CPUID из заголовка (+4). Дату на файлы поставил также по информации из заголовков блоков (+8). После этого я взял файл CPUCODE.EXE ("CBROM имя_файла_с_прошивкой /CPUCODE EXTRACT", на вопрос ответить "CPUCODE.EXE" без кавычек) из последнего BIOS'а от ASUS (v1010 от 16.07.99 для мамок P2B), отрезанием от него заголовка получил CPUCODE.BIN и "распотрошил" его таким же образом в другой директории. В ту же директорию добавил ещё два блока, найденные в DMI-области прошивки (для ASUS'а -- по смещениям 0x37000 и 0x37800 относительно начала файла с прошивкой). После этого объединил эти две директории в третьей, оставив из файлов с одинаковыми "aaaabb" в названии только более новые (с бОльшим номером "cc").

Оставшиеся в итоге в третьей директории 2-килобайтные файлы *.BIN я отсортировал по имени и объединил их в одну базу с помощью стандартной команды "COPY": "COPY /b xxx1+xxx2+...xxxN PEP15.PDB" (без кавычек, разумеется). Эту базу следует использовать вместо оригинальной январской 1999 года базы. Проверено на материнской плате A-Bit i440BX-6 Rev1.0 с процессором Celeron-333 (CPUID 0x0660).

Следует иметь в виду, что запись корректирующих микрокод блоков с использованием базы PEP15.PDB производится в область DMI флеш-памяти только для установленных в материнскую плату на момент запуска утилиты процессоров. После замены процессора на процессор с другим CPUID утилиту необходимо запускать повторно. Также необходим повторный запуск утилиты после очистки DMI (запуск AWDFLASH.EXE с ключом /CD). Однако для 2-мегабитных (256-килобайтных) BIOS'ов существует способ прописать всю базу непосредственно в файл прошивки. Для того надо переименовать файл PEP15.PDB в CPUCODE.BIN и выполнить следующую команду: "CBROM имя_файла_с_прошивкой /CPUCODE CPUCODE.BIN", без кавычек. К сожалению, этот способ не подходит для 1-мегабитных (128-килобайтных) BIOS'ов, поскольку вся база просто не влезает в этот BIOS (как я понимаю, именно этим обстоятельством и был вызван переход на 2-мегабитные BIOS'ы). Невозможно также применить этот способ и для Award-BIOS'ов от ASUS, ибо файл должен называться не CPUCODE.BIN, а CPUCODE.EXE, и в нём базе должен предшествовать заголовок, формата которого я не знаю. Работоспособность этого способа в части подмены оригинального CPUCODE проверено на файле прошивки от материнской платы A-Bit i440BX-6 Rev2.0, но саму прошивку я никуда не заливал (за неимением такой мамки). Как называется файл в вашем BIOS'е, вы можете посмотреть командой "CBROM имя_файла_с_прошивкой /D".

Позднее я таким же методом распотрошил более новую базу версии 5.01 и обнаружил два новых процессора, не вошедших в предыдущую мою сборку.

Для наглядности я привожу ниже таблицу поддерживаемых процессоров (таблица идёт на замену аналогичной в документации к утилите заливки изменений микрокода от Intel), отсортированную по CPUID/Mod.

Processor Processor Stepping/Mod Microcode Update Rev
Pentium Pro Processor 0x612/00 0xC6
Pentium Pro Processor 0x616/00 0xC6
Pentium Pro Processor 0x617/00 0xC6
Pentium Pro Processor 0x619/00 0xD2
?????????????????????????????? 0x630/00 0x13
?????????????????????????????? 0x632/00 0x20
Pentium II Processor 0x633/01 0x34
Pentium II Processor 0x634/01 0x35
Pentium II Processor 0x650/01 0x40
Intel Celeron Processor 0x650/01 0x40
Pentium II Processor 0x651/01 0x40
Intel Celeron Processor 0x651/01 0x40
Pentium II Processor 0x652/01 0x2A
Pentium II Xeon Processor 0x652/04 0x29
Pentium II Processor 0x653/01 0x10
Pentium II Xeon Processor 0x653/04 0x04
Intel Celeron Processor 0x660/01 0x0A
Intel Celeron Processor 0x665/10 0x03
?????????????????????????????? 0x670/01 0x06
?????????????????????????????? 0x671/01 0x03
! Pentium III Processor 0x672/01 0x10
Pentium III Xeon Processor 0x672/04 0x21
! Pentium III Processor 0x673/01 0x0E
Pentium III Xeon Processor 0x673/04 0x22
?????????????????????????????? 0x680/01 0x14
! ?????????????????????????????? 0x681/01 0x0D
! ?????????????????????????????? 0x681/10 0x11
! ?????????????????????????????? 0x683/01 0x0C
! ?????????????????????????????? 0x683/10 0x10
Pentium II OverDrive Processor x1632/00 0x02

Знаками "!" отмечены изменения относительно собранной мною базы предыдущей (от сентября 1999) версии. Изменения взяты из BIOS'а версии 1004 beta 005 от 31 января 2000 года для ASUS P3B-F.

Вопросами отмечены модели, которых нет в официальных базах от Intel, но которые (изменения ядра для них) присутствуют в BIOS'ах ряда материнских плат.

К данной статье прилагаются следующие файлы:

Pep15.zip (32.23 Kb) -- на основе базы 5.01 от апреля 1999.

content.zip (60.94 Kb) -- 2-килобайтные блоки, входящие в состав этой базы. Можете их использовать при формировании новой базы по алгоритму, описанному выше, когда у вас появится доступ к BIOS'у с более новой версией CPUCODE.

Ссылку на утилиту CBROM смотрите в материале по замене Logo в BIOS'е.

Кстати, по поводу A-Bit'а: в новых его мамках используется формат BIOS'а, несовместимый со старым, и его не берут старые утилиты от AWARD'а (MODBIN, CBROM ругаются на контрольную сумму), и для работы с этими BIOS'ами выпущена новая версия AWDFLASH'а -- 7.52C. Соответственно, для работы с этими BIOS'ами надо искать новые версии MODBIN'а и CBROM'а, а до этого момента подменить CPUCODE.BIN описанным в статье способом не получится (руками вставить, конечно, можно, но после этого надо пересчитывать контрольную сумму, что для меня не тривиально).

Пока обнаружена только одна материнская плата, запуск на которой процедуры обновления DMI (само обновление, а не проверка его необходимости) приводит к разрушению (расписыванию 0xFF) BIOS'а -- это P3B-F. Ради справедливости следует отметить, что формат DMI во флеше этой мамки нестандартен, и стандартные авардовские процедуры коррекции DMI либо вообще этого DMI не видят, либо отказываются вносить туда изменения. Ну а вот в интелевской утилите, которая используется для прописывания в DMI блока коррекции ERRATA, этой проверки, похоже, просто не сделали, отчего запарывание BIOS'а и происходит.

Список выявленных ошибок процессоров Intel с отметками, исправлены ли они, будут ли исправлены или исправления не планируются, смотрите по ссылкам с официального сайта компании Intel: http://www.intel.com/


Сергей Озеров (ozr@cnt.ru)
Опубликовано -- 25 августа 1999 года
Последнее обновление -- 9 марта 2000 года